recordset

命名空间:Ext.lt.recordset

说明:

recordset提供了对List+Map结构的数据压缩、解压处理,并提供排序、筛选、搜索等常用功能。
在服务端使用RecordSet对象对List+Map结构的数据进行压缩处理。代码如下

	RecordSet rs = new RecordSet(list);
	rs.setPerjson(false); // 这行必须加
	com.longtu.framework.rpcfw.mapper.ObjectReader reader = new com.longtu.framework.rpcfw.mapper.ObjectReader(rs);
	String r = reader.getObjectValue();

以单位信息为例传统的List+Map结构生成的json数据如下;
[{'code':'101','name':'省厅'},{'code':'102','name':'预算处'},{'code':'103','name':'国库处'},{'code':'104','name':'有关部门'}]
这种格式中字段名code,name重复多次,增加网络传输的开销。
recordset数据集采用数组保存字段名,二维数组保存数据,通过位置与字段名匹配的方式在前台还原成对象。使用recordset对象生成的json数据如下:
new Ext.lt.recordset({columns:['code','name'],datas:[['101','省厅'],['102','预算处'],['103','国库处'],['104','有关部门']]})

当数据中存在大量重复数据时,recordset会通过别名方式进一步压缩数据,例如凭证信息:
[{'billcode':'10001','expfunc':'201-功能分类'},{'billcode':'10002','expfunc':'201-功能分类'},{'billcode':'10003','expfunc':'201-功能分类'},{'billcode':'10004','expfunc':'201-功能分类'}]
压缩后:
function(){var $1='201-功能分类';return new Ext.lt.recordset({columns:['billcode','expfunc'],datas:[['10001',$1],['10002',$1],['10003',$1],['10004',$1]]})}();

初始化参数说明

参数名 数据类型 说明
version String 对象版本号,缺省为1.0,目前最新版本为3.0
type 对象类型 值集为recordset
columns 数组 数据集的列名
datas 二维数组 数据集的数据,数据的顺序必须与列数据保持一致

方法说明

size

返回数组长度
rs.size()

setData

向数据集中指定位置追加数据,当参数为数组类型时会将数组内的元素取出加到到数据集中,方法第二个参数为插入数据的位置从0开始。如果第二个参数为空则将数据追加到数据集的末尾
rs.setData({code:'201',name:'单位'},2)

addData

向数据集中的指定位置追加数据
rs.addData({code:'201',name:'单位'},0)

getData

从数据集中获取数据
rs.getData(0)

getDataValue

获取执行位置对象的属性值
rs.getData(0,'name')

getColNames

获取列名的数组
rs.getColNames

each

循环数据集,参数为处理函数,开始位置,结束位置。开始位置为空表示从数据集起始位置开始,结束位置为空表示循环到数据集结尾
rs.each(function(d){},0,3)

sort

按照指定属性排序,排序算法采用快速排序法。第二个参数控制升序还是降序,默认降序。recordset实例化之后会在对象上添加_locationposition属性,作为数据的默认顺序。如果直接调用sort方法,不指定字段名则按照locationposition属性排序
rs.sort('code',false)

clear

清除数据集内容
rs.clear()

delData

从数据集的指定位置开始删除数据,参数为判断删除的函数,返回true的数据将从数据集中删除
rs.delData(function(rs){return true},3)

join

合并两个数据集和字段,并将recordset1插入到指定位置
rs.join(recordset1,2)

toJSON

导出成标准的list+map的JSON格式
rs.toJSON()

toArrayJSON

转换为{columns:[],datas:[[],[]]}形式的字符串
rs.toArrayJSON()

setFilter

设置过滤条件,设置格式为{key:string/number/array,…}。设置过滤条件后,只能从结果集中获取到符合过滤条件的数据。
rs.setFilter({code:'201',name:['单位1','单位2']})

clearFilter

清除数据过滤条件
rs.clearFilter()

query

根据过滤条件查询数据集中的数据,返回值为数组,过滤条件格式为{key:string/number/array[number/string],…},返回数组,默认返回一个空数组
rs.query({code:'201',name:['单位1','单位2']})

select

从结果集中选择数据,fn函数为过滤函数,fn函数的参数为遍历的数据。select方法返回,fn函数判断为true的数据,返回对象类型为recordset
rs.select(function(d){return true})

getMaxColDataLength

返回记录每一列最大字符数的数组,汉字按两个字符处理
rs.getMaxColDataLength()

getMaxLength(String)

返回指定列数据中最大字符数,汉字按两个字符处理
rs.getMaxLength('code')

toArray()

将RecordSet数据集转换为List+Map结构的数据集
rs.toArray()

setTotal()

设置合计行的位置,指定的合计行不参与排序 rs.setTotal(0)

delRow()

从结果集中删除指定行,可以指定行号或通过数组同时删除多行 rs.delRow(1), rs.delRow([2,5,18])

示例:

toArray接口
var rs=new Ext.lt.recordset({columns:['code','name'],datas:[['101','一般预算'],['102','国防'],['103','科技']]});
$('toArrayTest').innerText=Object.toJSON(rs.toArray());
sort接口
var rs=new Ext.lt.recordset({columns:['code','name'],datas:[['102','国防'],['103','科技'],['101','一般预算']]});
rs.sort('code',true);
$('sortTest').innerText=Object.toJSON(rs.toArray());
join接口
var rs1=new Ext.lt.recordset({columns:['code','name'],datas:[['102','国防'],['103','科技'],['101','一般预算']]});
var rs2=new Ext.lt.recordset({columns:['code','value'],datas:[['104','农业'],['105','教育'],['106','卫生']]});
rs1.join(rs2)
$('joinTest').innerText=Object.toJSON(rs1.getColNames())+'\n'+Object.toJSON(rs1.toArray());
query接口
var rs=new Ext.lt.recordset({columns:['code','name'],datas:[['101','一般预算'],['102','国防'],['103','科技']]});
$('queryTest').innerText=Object.toJSON(rs.query({code:['101','103']}))+'\n'+Object.toJSON(rs.query({code:'103'}));
addData接口
var rs=new Ext.lt.recordset({columns:['code','name'],datas:[['101','一般预算'],['102','国防'],['103','科技']]});
rs.addData({'code':'104',name:'农业'},1);
rs.addData([{'code':'105',name:'教育'},{'code':'106',name:'卫生'}]);
$('addDataTest').innerText=Object.toJSON(rs.toArray());
setFilter接口
var rs=new Ext.lt.recordset({columns:['code','name'],datas:[['101','一般预算'],['102','国防'],['103','科技']]});
rs.setFilter({code:['101','103']});
$('setFilterTest').innerText=Object.toJSON(rs.toArray());
setTotal接口
var rs=new Ext.lt.recordset({columns:['code','name'],datas:[['101','一般预算'],['102','国防'],['103','科技']]});
rs.setTotal(0);
rs.sort('code',false);
$('setTotalTest').innerText=Object.toJSON(rs.toArray());
1.4数据结构测试
var rs=new function(){return new Ext.lt.recordset({ver:"1.4",compress:1,columns:["10000","10003","10001","10002"],datas:[{10000:"0\\10000",10003:"0\\10003",10001:"0\\10001",10002:"0\\10002"},{10000:"1\\10000",10003:"1\\10003",10001:"1\\10001",10002:"1\\10002"},{10000:"2\\10000",10003:"2\\10003",10001:"2\\10001",10002:"2\\10002"},{10000:"3\\10000",10003:"3\\10003",10001:"3\\10001",10002:"3\\10002"},{10000:"4\\10000",10003:"4\\10003",10001:"4\\10001",10002:"4\\10002"},{10000:"5\\10000",10003:"5\\10003",10001:"5\\10001",10002:"5\\10002"},{10000:"6\\10000",10003:"6\\10003",10001:"6\\10001",10002:"6\\10002"},{10000:"7\\10000",10003:"7\\10003",10001:"7\\10001",10002:"7\\10002"},{10000:"8\\10000",10003:"8\\10003",10001:"8\\10001",10002:"8\\10002"},{10000:"9\\10000",10003:"9\\10003",10001:"9\\10001",10002:"9\\10002"}],ml:[7,7,7,7]})};
$('recordsetcompress1').innerText=Object.toJSON(rs.toArray());

var rs=new function(){return new Ext.lt.recordset({ver:"1.4",compress:2,columns:["10000","10003","10001","10002"],datas:[["0\\10000","0\\10003","0\\10001","0\\10002"],["1\\10000","1\\10003","1\\10001","1\\10002"],["2\\10000","2\\10003","2\\10001","2\\10002"],["3\\10000","3\\10003","3\\10001","3\\10002"],["4\\10000","4\\10003","4\\10001","4\\10002"],["5\\10000","5\\10003","5\\10001","5\\10002"],["6\\10000","6\\10003","6\\10001","6\\10002"],["7\\10000","7\\10003","7\\10001","7\\10002"],["8\\10000","8\\10003","8\\10001","8\\10002"],["9\\10000","9\\10003","9\\10001","9\\10002"]],ml:[7,7,7,7]})}
$('recordsetcompress2').innerText=Object.toJSON(rs.toArray());

var rs=new function(){var N=null;return new Ext.lt.recordset({ver:"1.4",compress:1,columns:["10000","10003","10001","10002"],datas:[{10000:N,10003:"0\\",10001:"0\\",10002:"0\\"},{10000:N,10003:"1\\",10001:"1\\",10002:"1\\"},{10000:N,10003:"2\\",10001:"2\\",10002:"2\\"},{10000:N,10003:"3\\",10001:"3\\",10002:"3\\"},{10000:N,10003:"4\\",10001:"4\\",10002:"4\\"},{10000:N,10003:"5\\",10001:"5\\",10002:"5\\"},{10000:N,10003:"6\\",10001:"6\\",10002:"6\\"},{10000:N,10003:"7\\",10001:"7\\",10002:"7\\"},{10000:N,10003:"8\\",10001:"8\\",10002:"8\\"},{10000:N,10003:"9\\",10001:"9\\",10002:"9\\"}],ml:[0,2,2,2]})}
$('recordsetcompress3').innerText=Object.toJSON(rs.toArray());
delRow接口测试


var rs=new Ext.lt.recordset({columns:['code','name'],datas:[['101','一般预算'],['102','国防'],['103','科技'],['104','农业'],['105','军事']]});
rs.delRow(0);
$('recordsetdelrow1').innerText=Object.toJSON(rs.toArray());

var rs=new Ext.lt.recordset({columns:['code','name'],datas:[['101','一般预算'],['102','国防'],['103','科技'],['104','农业'],['105','军事']]});
rs.delRow([1,4]);
$('recordsetdelrow2').innerText=Object.toJSON(rs.toArray());

var rs=new Ext.lt.recordset({columns:['code','name'],datas:[['101','一般预算'],['102','国防'],['103','科技'],['104','农业'],['105','军事']]});
rs.delRow([5]);
$('recordsetdelrow3').innerText=Object.toJSON(rs.toArray());
toJSON性能测试

var cols=[],datas=[],log=[];
for(var i=0;i<20;i++){cols.push('col'+i);}
for(var j=0;j<10000;j++){
	var d=[];
	for(var i=0;i<20;i++) d.push('line'+j+'col'+i);
	datas.push(d);
}

var rs=new Ext.lt.recordset({columns:cols,datas:datas});
log.push('转换',rs.size(),'条数据的recordset对象耗时');
var start=new Date();
var json=rs.toJSON();
log.push((new Date()-start)+'ms'+(json.length)+'字节');

try{
 eval('('+json+')');	
}
catch(e){
	log.push('验证转换结果失败');
}
$('recordsettojson').innerHTML=log.join('');

toArrayJSON性能测试
var cols=[],datas=[],log=[];
for(var i=0;i<20;i++){cols.push('col'+i);}
for(var j=0;j<10000;j++){
	var d=[];
	for(var i=0;i<20;i++) d.push('line'+j+'col'+i);
	datas.push(d);
}

var rs=new Ext.lt.recordset({columns:cols,datas:datas});
log.push('转换',rs.size(),'条数据的recordset对象耗时');
var start=new Date();
var json=rs2W.datas.toJSON();
log.push((new Date()-start)+'ms'+(json.length)+'字节');

try{
 eval('('+json+')');	
}
catch(e){
	log.push('验证转换结果失败');
}
$('recordsettoarrayjson').innerHTML=log.join('');